Obsidian 実行中タスク選択1
セクション毎ソート
実行中タスク選択
Obsidianで### 🗂️ セクションごとに時刻順にソートし、
ソート後に "- " で始まる行のうち一番上の行の末尾にカーソルを合わせるスクリプト
タスクだけでなく、行間メモも合わせてソートできて便利
"実行中タスク選択"のイメージ(ただし、過去セクションに未完了タスクが残っている場合、過去セクションの未完了タスクが選択される)
code:js
<%*
// Obsidianで### 🗂️ セクションごとに時刻順にソートし、
// ソート後に "- " で始まる行のうち一番上の行の末尾にカーソルを合わせるスクリプト
async function sortTasksByTime() {
const activeLeaf = app.workspace.activeLeaf;
if (!activeLeaf) {
new Notice('エディターがアクティブではありません');
return;
}
const editor = activeLeaf.view.editor;
if (!editor) {
new Notice('エディタが見つかりません');
return;
}
// エディタの内容を取得
const content = editor.getValue();
const lines = content.split('\n');
// セクションを検出し、それぞれをソート対象として処理
let currentSectionStart = -1;
const sortedContent = [];
let sectionLines = [];
let firstCheckboxLineIndex = -1;
for (let i = 0; i < lines.length; i++) {
if (linesi.startsWith('### 🗂️')) { // 前のセクションをソートして出力
if (currentSectionStart !== -1) {
sortedContent.push(...sortSection(sectionLines));
}
// 新しいセクションの開始
sortedContent.push(linesi); // セクションタイトルを追加 currentSectionStart = i + 1;
sectionLines = []; // セクション内の行をリセット
} else if (currentSectionStart !== -1) {
sectionLines.push(linesi); // セクション内の行を集める } else {
sortedContent.push(linesi); // セクション前の行はそのまま保持 }
}
// 最後のセクションをソートして出力
if (currentSectionStart !== -1) {
sortedContent.push(...sortSection(sectionLines));
}
// 新しい内容をエディタに設定
editor.setValue(sortedContent.join('\n'));
// ソート後、"- "で始まる行のうち一番上の行の末尾にカーソルを合わせる
const newLines = editor.getValue().split('\n');
for (let i = 0; i < newLines.length; i++) {
if (newLinesi.startsWith('- ')) { firstCheckboxLineIndex = i;
break;
}
}
if (firstCheckboxLineIndex !== -1) {
editor.setCursor(firstCheckboxLineIndex, line.length); // カーソルを末尾にセット
// new Notice('カーソルをチェックボックス付きの最初の行に移動しました');
} else {
new Notice('チェックボックス付きの行が見つかりませんでした');
}
}
// セクション内の行をソートする関数
function sortSection(sectionLines) {
const linesWithTime = [];
const linesWithoutTime = [];
sectionLines.forEach(line => {
// @hh:mm 形式は無視する
const timeMatch = line.match(/\b(?<!@)\d{2}:\d{2}\b/);
if (timeMatch) {
linesWithTime.push({ line, time: timeMatch0 }); } else {
linesWithoutTime.push(line);
}
});
// 時刻を持つ行を時刻順にソート
const sortedLinesWithTime = linesWithTime.sort((a, b) => {
return a.time.localeCompare(b.time);
}).map(item => item.line);
// ソートされた行とその他の行を結合して返す
}
sortTasksByTime();
%>